home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / SpriteWorld 2.0 ƒ / SpriteWorld Examples / SpriteTest / Application.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-11  |  12.9 KB  |  667 lines  |  [TEXT/KAHL]

  1. ///--------------------------------------------------------------------------------------
  2. //    Application.c
  3. //
  4. // By: Tony Myles
  5. //
  6. // Extensive modifications by Karl Bunker
  7. //
  8. ///--------------------------------------------------------------------------------------
  9.  
  10.  
  11. #ifndef __GESTALTEQU__
  12. #include <GestaltEqu.h>
  13. #endif
  14.  
  15. #ifndef __PALETTES__
  16. #include <Palettes.h>
  17. #endif
  18.  
  19.  
  20. #include <SWIncludes.h>            // Automatically include all SpriteWorld.h files
  21. #include <SWGameUtils.h>
  22. #include "DialogUtils.h"
  23. /*
  24. #if __MWERKS__
  25. #include <profiler.h>
  26. #endif
  27. */
  28. #include "Application.h"
  29. #include "SpriteTest.h"
  30. #include "About.h"
  31.  
  32. #define kWindowInsetH 0     // modify to test windows smaller than 640x480 screen size
  33. #define kWindowInsetV 0
  34.  
  35. SpriteTestPtr             gSpriteTestP = NULL;
  36.  
  37. static Boolean             gDone = false;
  38. static Boolean             gInBackGround = false;
  39. static WindowPtr         gWindowP = NULL;
  40.  
  41. extern Boolean            gGlobesVisible;
  42. extern Boolean            gTitleVisible;
  43. extern Boolean            gCollisionDetection;
  44.  
  45.  
  46. /******************** main ********************/
  47. void main(void)
  48. {
  49.     OSErr err = noErr;
  50. /*
  51.     ProfilerInit( collectDetailed, bestTimeBase, 100, 40 );
  52.     ProfilerSetStatus( false );
  53. */
  54.     Initialize(2);
  55.  
  56.     CreateMenuBar();
  57.     CreateWindow();
  58.  
  59.     if (EnterApplication())
  60.     {
  61.         ServiceEvents();
  62.     }
  63.  
  64.     ExitApplication();
  65.  
  66.     ExitToShell();
  67. }
  68.  
  69.  
  70. /******************** Initialize ********************/
  71. void Initialize(
  72.     short numberOfMasters)
  73. {
  74.     OSErr err = noErr;
  75.  
  76.  
  77.     MaxApplZone();
  78.  
  79.     while (numberOfMasters--)
  80.         MoreMasters();
  81.  
  82.     InitGraf(&qd.thePort);
  83.     InitFonts();
  84.     InitWindows();
  85.     InitMenus();
  86.     TEInit();
  87.     InitDialogs(NULL);
  88.     InitCursor();
  89.     FlushEvents(everyEvent, 0);
  90.     
  91.     Randomize();
  92. }
  93.  
  94.  
  95. /******************** CreateMenuBar ********************/
  96. void CreateMenuBar(void)
  97. {
  98.     Handle menuBarH;
  99.  
  100.     menuBarH = GetNewMBar(kMenuBarResID);
  101.  
  102.     if (menuBarH != NULL)
  103.     {
  104.         SetMenuBar(menuBarH);
  105.         AddResMenu(GetMHandle(kAppleMenuID), 'DRVR');
  106.         DrawMenuBar();
  107.     }
  108.     else
  109.     {
  110.         CantFindResource();
  111.     }
  112. }
  113.  
  114.  
  115. /******************** CreateWindow ********************/
  116. void CreateWindow(void)
  117. {
  118.     Rect        monitorRect;
  119.     short        windowInsetH = kWindowInsetH;
  120.     short        windowInsetV = kWindowInsetV;
  121.     
  122.     
  123.     gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
  124.     
  125.     if (gWindowP != NULL)
  126.     {
  127.         monitorRect = (*GetMainDevice())->gdRect;
  128.         
  129.         SizeWindow(gWindowP, (monitorRect.right-monitorRect.left), 
  130.                     (monitorRect.bottom-monitorRect.top), false);
  131.                     
  132.         if ( (monitorRect.right-monitorRect.left) > 640 )
  133.             windowInsetH += ((monitorRect.right-monitorRect.left) - 640)/2;
  134.         if ( (monitorRect.bottom-monitorRect.top) > 480 )
  135.             windowInsetV += ((monitorRect.bottom-monitorRect.top) - 480)/2;
  136.         
  137.         SizeWindow(gWindowP, (monitorRect.right-monitorRect.left) - (windowInsetH*2), 
  138.                     (monitorRect.bottom-monitorRect.top) - (windowInsetV*2), false);
  139.         
  140.         MoveWindow(gWindowP, monitorRect.left + windowInsetH, 
  141.             monitorRect.top + windowInsetV, false);
  142.     }
  143.     else
  144.     {
  145.         CantFindResource();
  146.     }
  147. }
  148.  
  149.  
  150. /******************** EnterApplication ********************/
  151. Boolean EnterApplication(void)
  152. {
  153.     OSErr    err = noErr;
  154.     
  155.         
  156.     err = SWEnterSpriteWorld();
  157.     if ( err != noErr )
  158.         ErrorAlert(err, kCantRunStringIndex);
  159.  
  160.     if (err == noErr)
  161.     {
  162.         err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  163.     }
  164.  
  165.     if (err == noErr)
  166.     {
  167.         ShowWindow(gWindowP);
  168.         UpdateSpriteTest(gSpriteTestP, gWindowP);
  169.         ValidRect(&gWindowP->portRect);
  170.     }
  171.     
  172.     if (err != noErr)
  173.     {
  174.         ErrorAlert(err, kUnknownErrorStringIndex);
  175.     }
  176.  
  177.     return err == noErr;
  178. }
  179.  
  180.  
  181. /******************** ExitApplication ********************/
  182. void ExitApplication(void)
  183. {
  184.     
  185.     DisposeSWStuff(gSpriteTestP);
  186.     SWExitSpriteWorld();
  187.     
  188.     DisposeWindow(gWindowP);
  189. }
  190.  
  191.  
  192. /******************** ServiceEvents ********************/
  193. void ServiceEvents(void)
  194. {
  195.     Boolean haveEvent;
  196.     EventRecord event;
  197.     long sleepTime;
  198.  
  199.     while (!gDone)
  200.     {
  201.         sleepTime = gInBackGround ? kBackGroundSleepTime : kForeGroundSleepTime;
  202.         haveEvent = WaitNextEvent(everyEvent, &event, sleepTime, NULL);
  203.  
  204.         if (haveEvent)
  205.         {
  206.             DispatchEvent(&event);
  207.         }
  208.         else
  209.         {
  210.             HandleNullEvent();
  211.         }
  212.     }
  213. }
  214.  
  215.  
  216. /******************** DispatchEvent ********************/
  217. void DispatchEvent(
  218.     EventRecord* event)
  219. {
  220.     switch(event->what)
  221.     {
  222.         case mouseDown:
  223.             HandleMouseEvent(event);
  224.             break;
  225.         case mouseUp:
  226.             break;
  227.         case keyUp:
  228.             break;
  229.         case keyDown:
  230.         case autoKey:
  231.             HandleKeyEvent((char)(event->message & charCodeMask), event->modifiers);
  232.             break;
  233.         case updateEvt:
  234.             HandleUpdateEvent((WindowPtr)event->message);
  235.             break;
  236.         case diskEvt:
  237.             break;
  238.         case activateEvt:
  239.             break;
  240.         case networkEvt:
  241.             break;
  242.         case driverEvt:
  243.             break;
  244.         case app1Evt:
  245.             break;
  246.         case app2Evt:
  247.             break;
  248.         case app3Evt:
  249.             break;
  250.         case osEvt:
  251.             HandleOSEvent(event->message);
  252.             break;
  253.         case kHighLevelEvent:
  254.             break;
  255.         default:
  256.         break;
  257.     }
  258. }
  259.  
  260.  
  261. /******************** HandleMouseEvent ********************/
  262. void HandleMouseEvent(
  263.     EventRecord* event)
  264. {
  265.     WindowPtr whichWindow;
  266.     short partCode;
  267.  
  268.     partCode = FindWindow(event->where, &whichWindow);
  269.  
  270.     switch (partCode)
  271.     {
  272.         case inDesk:        
  273.             break;
  274.         case inMenuBar:
  275.             AdjustMenuItems();
  276.             HandleMenuCommand(MenuSelect(event->where));
  277.             break;
  278.         case inSysWindow:
  279.             SystemClick(event, whichWindow);
  280.             break;
  281.         case inContent:
  282.             RemoveClickedSprite( gSpriteTestP );
  283.             break;
  284.         case inDrag:
  285.             break;
  286.         case inGrow:
  287.             break;
  288.         case inGoAway:
  289.             break;
  290.         case inZoomIn:
  291.         case inZoomOut:
  292.             break;
  293.         default:            
  294.             break;
  295.     }
  296. }
  297.  
  298.  
  299. /******************** HandleKeyEvent ********************/
  300. void HandleKeyEvent(
  301.     char key,
  302.     short modifiers)
  303. {
  304.     
  305.     if ((modifiers & cmdKey) != 0)
  306.     {
  307.         AdjustMenuItems();
  308.         HandleMenuCommand(MenuKey(key));
  309.     }
  310.     else
  311.     {
  312.             // if the spacebar is hit, fill the screen with black
  313.             // useful for debugging purposes
  314.         if (key == ' ')
  315.         {
  316.             FillRect(&gSpriteTestP->spriteWorldP->windowFrameP->frameRect, &qd.black);
  317.         }
  318.     }
  319. }
  320.  
  321.  
  322. /******************** HandleUpdateEvent ********************/
  323. void HandleUpdateEvent(
  324.     WindowPtr updateWindowP)
  325. {
  326.     GDHandle        windowGDH;
  327.     OSErr            err; 
  328.     
  329.     if (updateWindowP == gWindowP)
  330.     {
  331.         SetPort(updateWindowP);
  332.         windowGDH = GetMaxDevice( &updateWindowP->portRect );
  333.         
  334.             // has the depth been changed?
  335.         if ( GetScreenDepth(windowGDH) != gSpriteTestP->spriteWorldP->pixelDepth )    
  336.         {    // if so, rebuild SpriteWorld
  337.             DisposeSWStuff(gSpriteTestP);
  338.             err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  339.             if ( err != noErr )
  340.                 ErrorAlert(err, kUnknownErrorStringIndex);
  341.         }
  342.         BeginUpdate(updateWindowP);
  343.  
  344.         UpdateSpriteTest(gSpriteTestP, updateWindowP);
  345.  
  346.         EndUpdate(updateWindowP);
  347.     }
  348. }
  349.  
  350.  
  351. void HandleOSEvent(
  352.     long message)
  353. {
  354.     if ((message >> 24) == suspendResumeMessage)
  355.     {
  356.         if ((message & resumeFlag) != 0)
  357.         {
  358.             gInBackGround = false;
  359.         }
  360.         else
  361.         {
  362.             gInBackGround = true;
  363.         }
  364.     }
  365. }
  366.  
  367.  
  368. void HandleNullEvent(void)
  369. {
  370.     SpriteTestIdle(gSpriteTestP);
  371. }
  372.  
  373.  
  374. /******************** HandleMenuCommand ********************/
  375. void HandleMenuCommand(
  376.     long menuItemIdentifier)
  377. {
  378.     short menuIdent = HiWord(menuItemIdentifier);
  379.     short menuItem = LoWord(menuItemIdentifier);
  380.  
  381.     switch (menuIdent)
  382.     {
  383.         case kAppleMenuID:
  384.             HandleAppleMenuCommand(menuItem);
  385.             break;
  386.  
  387.         case kFileMenuID:
  388.             HandleFileMenuCommand(menuItem);
  389.             break;
  390.  
  391.         case kEditMenuID:
  392.             HandleEditMenuCommand(menuItem);
  393.             break;
  394.  
  395.         case kSpriteMenuID:
  396.             HandleSpriteMenuCommand(menuItem);
  397.             break;
  398.  
  399.         case kTestMenuID:
  400.             HandleTestMenuCommand(menuItem);
  401.             break;
  402.     }
  403.     HiliteMenu(0);
  404. }
  405.  
  406.  
  407. /******************** HandleAppleMenuCommand ********************/
  408. void HandleAppleMenuCommand(
  409.     short menuItem)
  410. {
  411.     Str255 deskAccName;
  412.  
  413.     switch (menuItem)
  414.     {
  415.         case kAboutItem:
  416.             DisplayAboutBox();
  417.             break;
  418.  
  419.         default:
  420.             GetItem(GetMHandle(kAppleMenuID), menuItem, deskAccName);
  421.             OpenDeskAcc(deskAccName);
  422.             break;
  423.     }
  424. }
  425.  
  426.  
  427. /******************** HandleFileMenuCommand ********************/
  428. void HandleFileMenuCommand(
  429.     short menuItem)
  430. {
  431.     switch (menuItem)
  432.     {
  433.         case kQuitItem:
  434.             gDone = true;
  435.             break;
  436.     }
  437. }
  438.  
  439. /******************** HandleEditMenuCommand ********************/
  440. void HandleEditMenuCommand(
  441.     short menuItem)
  442. {
  443.     (void)SystemEdit(menuItem);
  444. }
  445.  
  446.  
  447. /******************** HandleSpriteMenuCommand ********************/
  448. void HandleSpriteMenuCommand(
  449.     short menuItem)
  450. {
  451.     switch (menuItem)
  452.     {
  453.         case kCreateSpriteItem:
  454.             HandleCreateSpriteCommand(gSpriteTestP);
  455.             break;
  456.  
  457.         case kHideTitleItem:
  458.             HandleSpriteTestTitleCommand(gSpriteTestP);
  459.             break;
  460.  
  461.         case kHideBallsItem:
  462.             HandleBouncingBallsCommand(gSpriteTestP);
  463.             break;
  464.     }
  465. }
  466.  
  467.  
  468. /******************** HandleTestMenuCommand ********************/
  469. void HandleTestMenuCommand(
  470.     short menuItem)
  471. {
  472.     switch (menuItem)
  473.     {
  474.         case kRunTestItem:
  475.             RunTheTest( gSpriteTestP );
  476.         break;
  477.         
  478.         case kSetUpTestItem:
  479.             SetUpTestDialog( gSpriteTestP );
  480.         break;
  481.         
  482.         case kCollisionDetectionItem:
  483.             gCollisionDetection = !gCollisionDetection;
  484.         break;
  485.         
  486.         case kMonitorDepthItem:
  487.             MonitorDepthDialog();
  488.         break;
  489.     }
  490. }
  491.  
  492.  
  493. /******************** AdjustMenuItems ********************/
  494. void AdjustMenuItems(void)
  495. {
  496.     MenuHandle tempMenuH;
  497.  
  498.         // adjust the sprite menu
  499.     tempMenuH = GetMHandle(kSpriteMenuID);
  500.  
  501.     CheckItem(tempMenuH, kHideTitleItem, gTitleVisible);
  502.     CheckItem(tempMenuH, kHideBallsItem, gGlobesVisible);
  503.  
  504.         // adjust the test menu
  505.     tempMenuH = GetMHandle(kTestMenuID);
  506.     
  507.     CheckItem(tempMenuH, kCollisionDetectionItem, gCollisionDetection);
  508.     
  509. }
  510.  
  511.  
  512. /******************** MonitorDepthDialog ********************/
  513. void MonitorDepthDialog(void)
  514. {
  515.     GrafPtr            savePort;
  516.     DialogPtr        theDialog;
  517.     short            itemHit;
  518.     GDHandle        windowGDH;
  519.     short            originalDepth, requestedDepth;
  520.     Boolean            done = false;
  521.     OSErr            err = noErr;
  522.     
  523.     
  524.     GetPort( &savePort );
  525.         
  526.     theDialog = GetNewDialog(kMonitorDepthResID, nil, (WindowPtr)-1L);
  527.         
  528.     SetDialogDefaultItem( theDialog, ok );
  529.     SetDialogCancelItem( theDialog, cancel );
  530.     
  531.     windowGDH = GetMaxDevice( &theDialog->portRect );
  532.     
  533.     originalDepth = requestedDepth = GetScreenDepth(windowGDH);
  534.             
  535.         // Check if monitor can display these depths
  536.     SetDItemHilite( theDialog, k1BitDepthButton, HasDepth(windowGDH, 1, 0, 0) );
  537.     SetDItemHilite( theDialog, k4BitDepthButton, HasDepth(windowGDH, 4, 0, 0) );
  538.     SetDItemHilite( theDialog, k8BitDepthButton, HasDepth(windowGDH, 8, 0, 0) );
  539.     SetDItemHilite( theDialog, k16BitDepthButton, HasDepth(windowGDH, 16, 0, 0) );
  540.     SetDItemHilite( theDialog, k32BitDepthButton, HasDepth(windowGDH, 32, 0, 0) );
  541.     
  542.     SetMonitorDepthButtons( theDialog, originalDepth );
  543.     
  544.     ShowWindow( theDialog );
  545.     
  546.     while ( !done )
  547.     {    
  548.         ModalDialog( nil, &itemHit );
  549.         switch( itemHit )
  550.         {
  551.             case k1BitDepthButton:
  552.                 requestedDepth = 1;
  553.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  554.             break;
  555.             case k4BitDepthButton:
  556.                 requestedDepth = 4;
  557.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  558.             break;
  559.             case k8BitDepthButton:
  560.                 requestedDepth = 8;
  561.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  562.             break;
  563.             case k16BitDepthButton:
  564.                 requestedDepth = 16;
  565.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  566.             break;
  567.             case k32BitDepthButton:
  568.                 requestedDepth = 32;
  569.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  570.             break;
  571.             case ok:
  572.             case cancel:
  573.                 done = true;
  574.             break;
  575.         }
  576.     }
  577.     DisposDialog( theDialog );
  578.     SetPort( savePort );
  579.     
  580.     if ( itemHit == ok )
  581.     {
  582.         DisposeSWStuff(gSpriteTestP);
  583.             // can we do colors?
  584.         if ( HasDepth(windowGDH, requestedDepth, 1, 1) )
  585.             (void)SetDepth( windowGDH, requestedDepth, 1, 1 );
  586.             // if not, settle for greyscale
  587.         else
  588.             (void)SetDepth( windowGDH, requestedDepth, 1, 0 );
  589.         
  590.         err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  591.         if ( err != noErr )
  592.             ErrorAlert(err, kUnknownErrorStringIndex);
  593.     }
  594. }
  595.  
  596.  
  597.  
  598. /******************** SetMonitorDepthButtons ********************/
  599. void SetMonitorDepthButtons(
  600.     DialogPtr theDialog,
  601.     short theDepth)
  602. {
  603.     SetCtlValue( (ControlHandle)GetDItemHdl(theDialog, k1BitDepthButton), (theDepth == 1) );
  604.     SetCtlValue( (ControlHandle)GetDItemHdl(theDialog, k4BitDepthButton), (theDepth == 4) );
  605.     SetCtlValue( (ControlHandle)GetDItemHdl(theDialog, k8BitDepthButton), (theDepth == 8) );
  606.     SetCtlValue( (ControlHandle)GetDItemHdl(theDialog, k16BitDepthButton), (theDepth == 16) );
  607.     SetCtlValue( (ControlHandle)GetDItemHdl(theDialog, k32BitDepthButton), (theDepth == 32) );
  608. }
  609.  
  610.  
  611. /******************** ErrorAlert ********************/
  612. void ErrorAlert(
  613.     OSErr err,
  614.     short errorStringIndex)
  615. {
  616.     Str255 messageString, errorString;
  617.  
  618.         // make sure we don't know what this error is...
  619.     if (errorStringIndex == kUnknownErrorStringIndex)
  620.     {
  621.         switch (err)
  622.         {
  623.             case memFullErr:
  624.                 errorStringIndex = kNotEnoughMemoryStringIndex;
  625.                 break;
  626.  
  627.             case resNotFound:
  628.                 errorStringIndex = kCantFindResourceStringIndex;
  629.                 break;
  630.         }
  631.     }
  632.  
  633.     GetIndString(messageString, kErrorStringListResID, errorStringIndex);
  634.  
  635.     if (messageString[0] == 0)
  636.     {
  637.         BlockMove(kSeriousDamageString, messageString, sizeof(kSeriousDamageString));
  638.     }
  639.  
  640.     NumToString(err, errorString);
  641.  
  642.     ParamText(messageString, errorString, "\p", "\p");
  643.  
  644.     (void)StopAlert(kErrorAlertResID, NULL);
  645.     
  646.     ExitToShell();
  647. }
  648.  
  649.  
  650. /******************** CantFindResource ********************/
  651. void CantFindResource(void)
  652. {
  653.     OSErr err;
  654.     
  655.     err = ResError();
  656.     
  657.     if (err == noErr)
  658.     {
  659.         err = resNotFound;
  660.     }
  661.  
  662.     ErrorAlert(err, kCantFindResourceStringIndex);
  663. }
  664.  
  665.  
  666.  
  667.